package framework.graphics.canvas;

import framework.Engine;
import framework.engine.AndroidEngine;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * Esta classe cria uma nova Thread para a rendização. Serve para
 * otimizar(bastante) a execução do código do jogo Leia o arquivo de ajuda para
 * entender como essa coisa funciona
 */
@SuppressLint("ViewConstructor")
public class FastRenderView extends SurfaceView implements Runnable {
	Engine game;
	Bitmap framebuffer;
	Thread renderThread = null;
	SurfaceHolder holder;
	volatile boolean running = false; // volatile serve para o compilador não
										// estragar a lógica do programa por
										// otimizações aletatórias que possa vir
										// a fazer

	public FastRenderView(AndroidEngine game, Bitmap framebuffer) {
		super(game);
		this.game = game;
		this.framebuffer = framebuffer;
		this.holder = getHolder();
	}

	public void resume() {
		running = true;
		renderThread = new Thread(this);
		renderThread.start();
	}

	/**
	 * Este é o laço principal do jogo. Aqui o mesmo é atualizado e renderizado
	 * na tela THIS IS SPARTAAAA!!!!!!!!!!
	 */
	public void run() {
		Rect dstRect = new Rect();
		long startTime = System.nanoTime();
		while (running) {
			if (!holder.getSurface().isValid())
				continue;

			float deltaTime = (System.nanoTime() - startTime) / 1000000000.0f;  
			//delta time = tempo que passou desde o último frame.
			startTime = System.nanoTime();

			game.getCurrentScreen().update(deltaTime);
			game.getCurrentScreen().render(deltaTime);

			Canvas canvas = holder.lockCanvas();
			canvas.getClipBounds(dstRect);         //////conversão para o screen size da tela atual
			canvas.drawBitmap(framebuffer, null, dstRect, null);
			holder.unlockCanvasAndPost(canvas);
		}
	}

	public void pause() {
		running = false;
		while (true) {
			try {
				renderThread.join();
				return;
			} catch (InterruptedException e) {
				// retry
			}
		}
	}
}